package mall

import (
	"e_mall_server/common"
	"e_mall_server/models"
	"e_mall_server/service"
	"errors"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
	"strconv"
)

/**
 * @Author: zhaobin
 * @Description TODO
 * @Date: 2022-05-19 15:55
 */

// LoginUser 后台管理系统，用户登陆
func LoginUser(c *gin.Context) {
	var param models.UserLoginParam
	if err := c.ShouldBind(&param); err != nil {
		ResponseError(c, "请求参数错误")
		return
	}
	zap.L().Debug("controller.Login", zap.Any("param", param))

	// 业务逻辑处理，判断账号密码是否正确
	userResponse, err := service.LoginUser(&param)
	if err != nil {
		zap.L().Error("service.UserLogin(&param) failed", zap.Error(err))
		ResponseError(c, "用户名或密码错误")
		return
	}

	// 返回响应
	ResponseSuccess(c, userResponse)
}

func Captcha(c *gin.Context) {
	id, b64s, err := service.MakeCaptcha()

	if err != nil {
		zap.L().Error("验证码刷新失败", zap.Error(err))
		ResponseError(c, "验证码刷新失败")
		return
	}

	ResponseSuccess(c, gin.H{
		"captchaId":    id,
		"captchaImage": b64s,
	})

}

// GetUserList 获取用户列表接口
func GetUserList(c *gin.Context) {
	UserList, err := service.GetUserList()
	if err != nil {
		zap.L().Error("service.GetUserList() failed", zap.Error(err))
		ResponseError(c, "查询用户列表失败")
		return
	}
	//zap.L().Debug("用户列表数据", zap.Any("value", UserList))
	ResponseSuccess(c, UserList)
}

// AddUser 添加用户信息接口
func AddUser(c *gin.Context) {
	User := models.User{}
	if err := c.ShouldBind(&User); err != nil {
		zap.L().Error("AddUser with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
		return
	}

	// 业务逻辑处理
	if err := service.AddUser(&User); err != nil {
		zap.L().Error("service.AddUser(&User) failed", zap.Error(err))
		ResponseError(c, err.Error())
		return
	}
	// 创建成功返回响应
	ResponseSuccess(c, nil)

}

// UpdateUser 修改用户信息接口，用户名和密码不支持修改
func UpdateUser(c *gin.Context) {
	User := models.User{}
	if err := c.ShouldBind(&User); err != nil {
		zap.L().Error("UpdateUser with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
		return
	}

	// 业务逻辑处理
	if count := service.UpdateUser(&User); count > 0 {
		// 创建成功返回响应
		ResponseSuccess(c, nil)
		return
	}
	ResponseError(c, "修改用户失败 请重试")
}

// DeleteUser 删除用户接口
func DeleteUser(c *gin.Context) {
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		zap.L().Error("DeleteUser with invalid param", zap.Error(err))
		ResponseError(c, "传入参数错误")
		return
	}
	if count := service.DeleteUserById(id); count > 0 {
		ResponseSuccess(c, nil)
		return
	}
	ResponseError(c, "删除失败")
}

// 获取当前登陆的用户id
func getCurrentUserId(c *gin.Context) (UserId int64, err error) {
	// 获得用户的id
	id, ok := c.Get(common.ContextUserIdKey)
	if !ok {
		// 没有登陆
		err = errors.New("用户未登录")
		return
	}
	UserId, ok = id.(int64)
	if !ok {
		err = errors.New("用户未登录")
		return
	}
	return
}

// GetUserDetailById 通过id查询用户信息
func GetUserDetailById(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		zap.L().Error("GetUserDetailById with invalid param", zap.Error(err))
		ResponseError(c, "请求参数错误")
	}
	User, err := service.GetUserDetailById(id)
	if err != nil {
		zap.L().Error("service.GetUserDetailById(id) failed", zap.Error(err))
		ResponseError(c, "获取用户信息错误")
		return
	}
	ResponseSuccess(c, User)
}
